﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Biblioteca.Logica_Negocio.Domain_Model;
using Biblioteca.Acceso_a_Datos.Data_Mappers;

namespace PresentacionBiblioWeb.Controllers
{
    public class PrestamosController : Controller
    {
        private BibliotecaContext db;
        private RepoGenerico<Prestamo> repo;


        public PrestamosController() {

            this.db = new BibliotecaContext();
            this.repo = new RepoGenerico<Prestamo>(this.db);
        }

        //
        // GET: /Prestamos/
        [Authorize(Roles = "Administrador")]
        public ActionResult Index(string nombre, string apellido, string titulo)
        {
            IEnumerable<Prestamo> prestamos = this.repo.Todos();

            if (!string.IsNullOrEmpty(titulo))
            {
                prestamos = prestamos.Where(c => c.Ejemplar.Material.Titulo.ToLower().Contains(titulo));
            }
            if (!string.IsNullOrEmpty(nombre))
            {
                prestamos = prestamos.Where(c => c.Socio.Nombre.ToLower().Contains(nombre));
            }
            if (!string.IsNullOrEmpty(apellido))
            {
                prestamos = prestamos.Where(c => c.Socio.Apellido.ToLower().Contains(apellido));
            }

            return View(prestamos);
        }


        //
        // GET: /Devoluciones/
        [Authorize (Roles = "Administrador")]
        public ActionResult Devoluciones(string nombre, string apellido, string titulo, string codigo)
        {
            IEnumerable<Prestamo> prestamos = this.repo.Todos().Where(x => x.EstaDespachado());

            if (!string.IsNullOrEmpty(titulo))
            {
                prestamos = prestamos.Where(c => c.Ejemplar.Material.Titulo.ToLower().Contains(titulo));
            }
            if (!string.IsNullOrEmpty(nombre))
            {
                prestamos = prestamos.Where(c => c.Socio.Nombre.ToLower().Contains(nombre));
            }
            if (!string.IsNullOrEmpty(apellido))
            {
                prestamos = prestamos.Where(c => c.Socio.Apellido.ToLower().Contains(apellido));
            }
            if (!string.IsNullOrEmpty(codigo))
            {
                prestamos = prestamos.Where(c => c.Ejemplar.Codigo.ToString().ToLower().Contains(codigo));
            }

            return View(prestamos);
        }

        //
        // GET: /Devoluciones/
        [Authorize(Roles = "Administrador")]
        public ActionResult Despachos(string nombre, string apellido, string titulo, string codigo)
        {
            IEnumerable<Prestamo> prestamos = this.repo.Todos().Where(x => x.EstaPendiente());

            if (!string.IsNullOrEmpty(titulo))
            {
                prestamos = prestamos.Where(c => c.Ejemplar.Material.Titulo.ToLower().Contains(titulo));
            }
            if (!string.IsNullOrEmpty(nombre))
            {
                prestamos = prestamos.Where(c => c.Socio.Nombre.ToLower().Contains(nombre));
            }
            if (!string.IsNullOrEmpty(apellido))
            {
                prestamos = prestamos.Where(c => c.Socio.Apellido.ToLower().Contains(apellido));
            }
            if (!string.IsNullOrEmpty(codigo))
            {
                prestamos = prestamos.Where(c => c.Ejemplar.Codigo.ToString().ToLower().Contains(codigo));
            }

            return View(prestamos);
        }


        //
        // GET: /Devoluciones/
        [Authorize(Roles = "Administrador")]
        public ActionResult Vencidos(string nombre, string apellido, string titulo, string codigo)
        {

            //busco los vencidos que estan pendientes o despachados
            IEnumerable<Prestamo> prestamos = this.repo.Todos().Where(x => (x.FechaVencimiento < DateTime.Today) && ((x.EstaPendiente()) || (x.EstaDespachado())));

            if (!string.IsNullOrEmpty(titulo))
            {
                prestamos = prestamos.Where(c => c.Ejemplar.Material.Titulo.ToLower().Contains(titulo));
            }
            if (!string.IsNullOrEmpty(nombre))
            {
                prestamos = prestamos.Where(c => c.Socio.Nombre.ToLower().Contains(nombre));
            }
            if (!string.IsNullOrEmpty(apellido))
            {
                prestamos = prestamos.Where(c => c.Socio.Apellido.ToLower().Contains(apellido));
            }
            if (!string.IsNullOrEmpty(codigo))
            {
                prestamos = prestamos.Where(c => c.Ejemplar.Codigo.ToString().ToLower().Contains(codigo));
            }

            return View(prestamos);
        }


        //
        // GET: /Devolver/
        [Authorize(Roles = "Administrador")]
        public ActionResult Devolver(int id)
        {
            Prestamo prestamo = this.repo.Buscar(id);
            prestamo.Devolver();
            db.SaveChanges();
            return RedirectToAction("Devoluciones");
        }

        //
        // GET: /Devolver/
        [Authorize(Roles = "Administrador")]
        public ActionResult Despachar(int id)
        {
            Prestamo prestamo = this.repo.Buscar(id);
            IEnumerable<Prestamo> prestamos = this.repo.EncontrarTodosSegun(x => x.Socio.Id == prestamo.Socio.Id).ToList();
            prestamos = prestamos.Where(x => x.EstaDespachado());
            if (prestamos.Count() <= 2)
            {
                prestamo.Despachar();
                db.SaveChanges();
            }
            else
            { 
                //tiene 3 ejemplares en mano
            }
            return RedirectToAction("Despachos");
        }

        //
        // GET: /Devolver/
        [Authorize(Roles = "Administrador")]
        public ActionResult Cancelar(int id)
        {
            Prestamo prestamo = this.repo.Buscar(id);
            prestamo.Cancelar();
            db.SaveChanges();
            return RedirectToAction("Vencidos");
        }


        protected override void Dispose(bool disposing)
        {
            this.repo.Dispose();
            base.Dispose(disposing);
        }
    }
}